/**
 * 
 */
package com.proyecto.contratos.modelo.servicios;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.exception.ConstraintViolationException;

import com.proyecto.contratos.modelo.dto.Contratos;
import com.proyecto.contratos.modelo.dto.ContratosPortafolioservicios;
import com.proyecto.contratos.modelo.dto.CorrelativosContratacionId;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.ServicioGenerico;
import com.proyecto.histoclin.modelo.dto.Cups;
import com.proyecto.histoclin.modelo.dto.EntessaludPortafolioservicios;

/**
 * @author vico
 *
 */
public class ServicioEntessaludPortafolioservicios extends ServicioGenerico {

	/**
	 * 
	 */
	ServicioCorrelativosContratacion servicioCorrelativosContratacion;
		

	public ServicioEntessaludPortafolioservicios() {
		// TODO Auto-generated constructor stub
	}

	
	@Override
	public void incluir(Object pojo, boolean iniciaTransaccion) throws GeneralException {
		// TODO Auto-generated method stub

		EntessaludPortafolioservicios objEntessaludPortafolioservicios = (EntessaludPortafolioservicios) pojo;

		if (isValidacionActiva()){
			validacion.incluir(objEntessaludPortafolioservicios);
		}
		
		try {
			Long proxNumero = servicioCorrelativosContratacion.obtenerProximoNumeroComoEntero(
					new CorrelativosContratacionId (objEntessaludPortafolioservicios.getId().getCiaopr(),"ENTSALPORTASERV","entsalportaservicod"),true);
					
			objEntessaludPortafolioservicios.getId().setEntsalportaservicod(proxNumero.intValue());
			
			super.incluir(objEntessaludPortafolioservicios, true);
			
		} catch (org.springframework.dao.DataIntegrityViolationException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.PropertyValueException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.datoRequeridoVacio");
			} else if (e.getMostSpecificCause() instanceof ConstraintViolationException) {
				throw new GeneralException(
						"advertencia." + claveProperties + ".incluir.registroDuplicado");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");

		} catch (org.springframework.dao.DataAccessResourceFailureException e) {
			
			if (e.getMostSpecificCause() instanceof org.hibernate.exception.JDBCConnectionException) {
				throw new GeneralException(
						"error." + claveProperties + ".conexion");
			}
			throw new GeneralException("error." + claveProperties + ".incluir");
		} catch (Exception e) {
			System.err.println(":::ServicioEntessaludPortafolioservicios::: " + e.getMessage());
			if("advertencia.contratos.tablaApoyo.CorrelativosContratos.modificar.BloqueoOptimista".equals(e.getMessage())){
				throw new GeneralException(	e.getMessage());
			}else{
				throw new GeneralException(
						"error." + claveProperties + ".desconocido");
			}
			
		}
	}


	public List<Cups> obtenerContratosPortafolioserviciosConContratoAsociado(
			String ciaopr, Integer contratocod, boolean asociadaAlContrato) throws Exception{
		
		String in_notin = asociadaAlContrato?" in":" not in";
		String query = "FROM Cups cup " +
						"WHERE cup.id.ciaopr = '"+ciaopr+"' AND " +
								"cup.nivel = 6 AND " +
								"cup.id.cupscod "+in_notin+"(" +
									"SELECT cps.cupscod " +
									"FROM ContratosPortafolioservicios cps " +
									"WHERE cps.id.ciaopr = cup.id.ciaopr AND " +
										"cps.id.contratocod = "+contratocod+")";
		return propiedadDAO.ejecutarQueryConsulta(query, null);
	}


	public List<Cups> obtenerCupsSiContratoAsociado(
			String ciaopr, Integer contratocod){
		String hqlQuery = "from Cups cup where cup.id.ciaopr = '"+ciaopr+"' ";
		
		String sqlQuery = "SELECT  cup.cupscod FROM cups cup " +
							"WHERE cup.ciaopr = '"+ciaopr+"' " +
									"AND cup.nivel = 6 " +			
								" except " +
								" (SELECT cps.cupscod " +
									"FROM contratos_portafolioservicios cps " +
									"WHERE cps.ciaopr = '"+ciaopr+"' " +
										"AND cps.contratocod = " + contratocod + ")";
		
		try {
			System.out.println("obtenerCupsSiContratoAsociado.sqlQuery: " + sqlQuery);
			try {

				List cups = propiedadDAO.ejecutarConsultaSQL(sqlQuery, null);
				System.out.println("obtenerCupsSiContratoAsociado.cups.size() " + cups.size()); 
				Integer paginas = cups.size()/100;
				System.out.println("paginas: " + paginas);
				String cupstring ="";
				if(cups == null){
					return new ArrayList<Cups>();
				}else{
					for(int i = 0; i<cups.size();i++){
						if(i>0){
							cupstring = cupstring + ", '" + cups.get(i) + "'";
						}else{
							cupstring = cupstring + "'" + cups.get(i) + "'";
						}
										
											
					}	
					hqlQuery = cups.size()>0?hqlQuery+" and cup.id.cupscod in("+cupstring+")":"";
					System.out.println("hqlQuery-> " + hqlQuery);
					if (hqlQuery.equalsIgnoreCase("")){
						return new ArrayList<Cups>();
					}else{
						//List<Cups> listaCups = propiedadDAO.ejecutarQueryConsulta(hqlQuery, null);
						//return listaCups;
						return new ArrayList<Cups>();
					}
				}
			} catch (Exception e) {
				// TODO: handle exception
				System.out.println("ERROR.obtenerCupsSiContratoAsociado.2-> " + e.getMessage());
				return new ArrayList<Cups>();
			}


		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("ERROR.obtenerCupsSiContratoAsociado.3-> " + e.getMessage());
			return new ArrayList<Cups>();
		}
		//return null;
	}

	public void setServicioCorrelativosContratacion(
			ServicioCorrelativosContratacion servicioCorrelativosContratacion) {
		this.servicioCorrelativosContratacion = servicioCorrelativosContratacion;
	}

	public ServicioCorrelativosContratacion getServicioCorrelativosContratacion() {
		return servicioCorrelativosContratacion;
	}
	
}
